#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "header.h"



int appartient_permutation(int c,int** tabl,int flag,int nb_permutations)
{
  
  int boolean=0;
  int i=0;
  int res=-1;

  switch(flag)
    {
    case 0 : 
      {
    while ((boolean==0) && (i<nb_permutations))
	  {
	    
	    if (tabl[i][0]==c)
	      {
        boolean=1;
		res=tabl[i][1];
	      }
	    i++;
	  }
	break;
      }

 case 1 : 
      {
    while ((boolean==0) && (i<nb_permutations))
	  {
	    
	    if (tabl[i][1]==c)
	      {
        boolean=1;
		res=tabl[i][0];
	      }
	    i++;
	  }
	break;
      }

    default : 
      break;
    }
  
  return res;
}







void mouvement_rotors(Rotor_intern* r1, Rotor_intern* r2, Rotor_intern* r3, int* pos_r1, int* pos_r2, int* pos_r3)
{


  if (*pos_r1==r2->encoche)
    {
     *(pos_r2)=(*(pos_r2)+1)%26;
    }

  if (*pos_r2==r3->encoche)
    {
      *(pos_r3)=(*(pos_r3)+1)%26;
      if (*pos_r3==r2->encoche)
	*(pos_r2)=(*(pos_r2)+1)%26;
    }

} 







int traitement(Rotor_intern* r1, Rotor_intern* r2, Rotor_intern* r3, Reflecteur* refl, Plugboard* plugb, int* pos_r1, int* pos_r2, int* pos_r3, int c, int nb_permutations)
{

  int temp;
  int temp2;

  *(pos_r1)=(*(pos_r1)+1)%26;
  mouvement_rotors(r1,r2,r3,pos_r1,pos_r2,pos_r3);
  

  temp=appartient_permutation(c,plugb->connexions,0,nb_permutations);
  
  if (temp<0)
    temp=c;


  temp2 = r1->sorties[(temp+*pos_r1)%26]; /* passage au rotor 1 */
  temp = r2->sorties[(temp2+*pos_r2)%26];  /* passage au rotor 2 */
  temp2 = r3->sorties[(temp+*pos_r3)%26];  /* passage au rotor 3 */
  temp = refl->sorties[temp2];
  temp2 = r3->sorties[(temp+*pos_r3)%26];   /* retour par le rotor 3 */
  temp = r2->sorties[(temp2+*pos_r2)%26];   /*retour par le rotor 2 */
  temp2 = r2->sorties[(temp+*pos_r1)%26];   /* retour par le rotor 1 */
  
  temp = appartient_permutation(temp2,plugb->connexions,1,nb_permutations);
  
  if (temp!=-1)
    return temp;
  else
    return temp2;
}




///*
//int main(int argc, char** argv, char** argenv) {



//  char c; /* caractère de saisie de l'utilisateur */
//  int res; /* le résultat du codage de c par la machine */
//  int pos_r1;
//  int pos_r2;
//  int pos_r3;
//  int d;
//  char* tmp;
//  char* texte;
//  int choix; /* ==0 : -trace activée on affiche lettre par lettre avec wait? ; sinon ==1 : -saisie ; sinonc -print ==2 on affiche direct le résultat */
//  int i;
//  int nb_permutations; /* le nombre de permutations du plugboard */
  

//  /* déclaration des rotors, du réflecteur et du plugboard */
//  Rotor_intern* rotor1;
//  Rotor_intern* rotor2;
//  Rotor_intern* rotor3;
//  Reflecteur* refl;
//  Plugboard* plugb;
  



 

  
 
//  plugb = (Plugboard*) malloc(sizeof(Plugboard));
//  plugb->connexions = (int**) malloc(sizeof(int*)*10);
//  for (i=0; i<10; i++)
//    plugb->connexions[i]=(int*) malloc (sizeof(int)*2);
//  nb_permutations = traitement_machine(argc, argv, &choix, &texte,plugb);



// /* déclaration des rotors, du réflecteur et du plugboard */
//  rotor1 = (Rotor_intern*) malloc(sizeof(Rotor_intern));
//  rotor1->encoche=12;
  
//  rotor2 = (Rotor_intern*) malloc(sizeof(Rotor_intern));
//  rotor2->encoche=16;

//  rotor3 = (Rotor_intern*) malloc(sizeof(Rotor_intern));
//  rotor3->encoche=8;

//  refl = (Reflecteur*) malloc(sizeof(Reflecteur));
  

//  /* emplacements pour les permutations */
//  rotor1->sorties = (int*) malloc(sizeof(int)*26);
//  rotor2->sorties = (int*) malloc(sizeof(int)*26);
//  rotor3->sorties = (int*) malloc(sizeof(int)*26);
//  refl->sorties = (int*) malloc(sizeof(int)*26);
  



//  /* permutations du rotor1 */
//  rotor1->sorties[0]=1;
//  rotor1->sorties[1]=3;
//  rotor1->sorties[2]=0;
//  rotor1->sorties[3]=2;
//  rotor1->sorties[4]=8;
//  rotor1->sorties[5]=7;
//  rotor1->sorties[6]=4;
//  rotor1->sorties[7]=10;
//  rotor1->sorties[8]=9;
//  rotor1->sorties[9]=12;
//  rotor1->sorties[10]=5;
//  rotor1->sorties[11]=13;
//  rotor1->sorties[12]=6;
//  rotor1->sorties[13]=14;
//  rotor1->sorties[14]=11;
//  rotor1->sorties[15]=16;
//  rotor1->sorties[16]=17;
//  rotor1->sorties[17]=19;
//  rotor1->sorties[18]=21;
//  rotor1->sorties[19]=15;
//  rotor1->sorties[20]=18;
//  rotor1->sorties[21]=20;
//  rotor1->sorties[22]=25;
//  rotor1->sorties[23]=24;
//  rotor1->sorties[24]=23;
//  rotor1->sorties[25]=22;


//  /* permutations du rotor2 */
//  rotor2->sorties[0]=14;
//  rotor2->sorties[1]=9;
//  rotor2->sorties[2]=0;
//  rotor2->sorties[3]=12;
//  rotor2->sorties[4]=20;
//  rotor2->sorties[5]=3;
//  rotor2->sorties[6]=5;
//  rotor2->sorties[7]=2;
//  rotor2->sorties[8]=10;
//  rotor2->sorties[9]=4;
//  rotor2->sorties[10]=1;
//  rotor2->sorties[11]=8;
//  rotor2->sorties[12]=16;
//  rotor2->sorties[13]=7;
//  rotor2->sorties[14]=11;
//  rotor2->sorties[15]=18;
//  rotor2->sorties[16]=23;
//  rotor2->sorties[17]=19;
//  rotor2->sorties[18]=17;
//  rotor2->sorties[19]=21;
//  rotor2->sorties[20]=22;
//  rotor2->sorties[21]=6;
//  rotor2->sorties[22]=13;
//  rotor2->sorties[23]=25;
//  rotor2->sorties[24]=15;
//  rotor2->sorties[25]=24;


//  /* permutations du rotor3 */
//  rotor3->sorties[0]=6;
//  rotor3->sorties[1]=4;
//  rotor3->sorties[2]=9;
//  rotor3->sorties[3]=20;
//  rotor3->sorties[4]=18;
//  rotor3->sorties[5]=0;
//  rotor3->sorties[6]=2;
//  rotor3->sorties[7]=8;
//  rotor3->sorties[8]=5;
//  rotor3->sorties[9]=7;
//  rotor3->sorties[10]=12;
//  rotor3->sorties[11]=3;
//  rotor3->sorties[12]=11;
//  rotor3->sorties[13]=1;
//  rotor3->sorties[14]=10;
//  rotor3->sorties[15]=13;
//  rotor3->sorties[16]=15;
//  rotor3->sorties[17]=25;
//  rotor3->sorties[18]=14;
//  rotor3->sorties[19]=21;
//  rotor3->sorties[20]=24;
//  rotor3->sorties[21]=23;
//  rotor3->sorties[22]=17;
//  rotor3->sorties[23]=22;
//  rotor3->sorties[24]=16;
//  rotor3->sorties[25]=19;


//  /* permutations du réflecteur */
//  refl->sorties[0]=24;
//  refl->sorties[1]=17;
//  refl->sorties[2]=20;
//  refl->sorties[3]=7;
//  refl->sorties[4]=16;
//  refl->sorties[5]=18;
//  refl->sorties[6]=11;
//  refl->sorties[7]=3;
//  refl->sorties[8]=15;
//  refl->sorties[9]=23;
//  refl->sorties[10]=13;
//  refl->sorties[11]=6;
//  refl->sorties[12]=14;
//  refl->sorties[13]=10;
//  refl->sorties[14]=12;
//  refl->sorties[15]=8;
//  refl->sorties[16]=4;
//  refl->sorties[17]=1;
//  refl->sorties[18]=5;
//  refl->sorties[19]=25;
//  refl->sorties[20]=2;
//  refl->sorties[21]=22;
//  refl->sorties[22]=21;
//  refl->sorties[23]=9;
//  refl->sorties[24]=0;
//  refl->sorties[25]=19;


//  /* permutations du plugboard
//   plugb->connexions[0][0]=22;
//  plugb->connexions[1][0]=10;
//  plugb->connexions[2][0]=17;
//  plugb->connexions[3][0]=0;
//  plugb->connexions[4][0]=15;
//  plugb->connexions[5][0]=6;
//  plugb->connexions[6][0]=18;
//  plugb->connexions[7][0]=3;
//  plugb->connexions[8][0]=9;
//  plugb->connexions[9][0]=11;

//  plugb->connexions[0][1]=2;
//  plugb->connexions[1][1]=8;
//  plugb->connexions[2][1]=24;
//  plugb->connexions[3][1]=12;
//  plugb->connexions[4][1]=1;
//  plugb->connexions[5][1]=14;
//  plugb->connexions[6][1]=5;
//  plugb->connexions[7][1]=13;
//  plugb->connexions[8][1]=21;
//  plugb->connexions[9][1]=7;*/
  

  
//  c='a'; /* caractère de saisie de l'utilisateur */
  
//  pos_r1=char_to_int(argv[1][0]);
//  pos_r2=char_to_int(argv[2][0]);
//  pos_r3=char_to_int(argv[3][0]);


  
//  /*  if(system("clear")<0)
//    {
//      fprintf(stderr,"Erreur system(\"clear\")\n");
//      }*/

//  if (choix==1)
//    {

//      affichage_machine(pos_r1,pos_r2,pos_r3,-1,0); /* on affiche les rotors au commencement*/
//      while (1)
//	{
//	  if (scanf("%c",&c)<0)
//	    {
//	      fprintf(stderr,"Erreur scanf Machine\n");
//	    }
	  
//	  if (c != '\n') /* vidage du buffer stdin pour enchainer correctement les scanf; */
//	    {
//	      while ((d = getchar ()) != '\n' && d != EOF)
//		{
		  
//		}
//	    }
	  
//	  if (c!='$')
//	    {
	      
//	      res = traitement(rotor1,rotor2,rotor3,refl,plugb,&pos_r1,&pos_r2,&pos_r3,char_to_int(c),nb_permutations);
//	      affichage_machine(pos_r1,pos_r2,pos_r3,res,0);
	      
//	    }
	  
//	  else
//	    {
//	      break;
//	    }
//	}
      
//    }
  

//  else
//    {
//      tmp = (char*) malloc((int)strlen(texte));
//      if (choix==2)
//	{
//	  for (d=0;d<strlen(texte);d++)
//	    {
//	      res = traitement(rotor1,rotor2,rotor3,refl,plugb,&pos_r1,&pos_r2,&pos_r3,char_to_int(texte[d]),nb_permutations);
//	      tmp[d]=int_to_char(res,0);
//	    }
	  
//	  affichage_machine(pos_r1,pos_r2,pos_r3,-1,0); /* -1 dans le cas où on veut juste afficher la position des rotors. */
//	  affichage(tmp);
//	}

//      else /* choix==0 */
//	{
//	  affichage_machine(pos_r1,pos_r2,pos_r3,-1,0);
//	  for (d=0;d<strlen(texte);d++)
//	    {
//	      res = traitement(rotor1,rotor2,rotor3,refl,plugb,&pos_r1,&pos_r2,&pos_r3,char_to_int(texte[d]),nb_permutations);
//	      tmp[d]=int_to_char(res,0);
//	      affichage_machine(pos_r1,pos_r2,pos_r3,res,-1);
//	      sleep(1);
//	    }
	  
	  
//	  affichage(tmp);

	  
//	}
//      free(tmp);
//      free(texte);
//    }

  
  



//  free(rotor1->sorties);
//  free(rotor2->sorties);
//  free(rotor3->sorties);
//  free(refl->sorties);
//  for (i=0;i<10;i++)
//    free(plugb->connexions[i]);
//  free(plugb->connexions);

//  free(rotor1);
//  free(rotor2);
//  free(rotor3);
//  free(refl);
//  free(plugb);
//  return (EXIT_SUCCESS);
//}

